[AWS Security Hub]複数リージョンでIAMコントロールが定期実行される頻度を確認して、爆増した料金を算出してみた
こんにちは、AWS事業本部@福岡オフィスのべこみん(@beco_minn)です。
突然ですが、皆さんは利用している全てのリージョンでAWS Security Hub(以下Security Hub)を有効化していますか?
複数のリージョンでSecurity Hubを有効化した場合、AWS IAMやAmazon CloudFrontなどグローバルなサービスの一部コントロールは複数のリージョンでセキュリティチェックが行われてしまいます。
このようなコントロールは任意の1リージョンを除く全てのリージョンで無効化することがAWSからも推奨されています。詳しくは以下をご参照ください。
そんなグローバルリソースのコントロールですが、対象のリソースが多く存在する場合、結構馬鹿にならないコストになってしまいます。今回は特にIAMリソースが大量に存在する環境におけるコストの削減と検証を行いましたので、本記事にまとめます。
背景
そもそも本記事を書こうとしたきっかけは、とある環境でSecurity Hubの料金が爆増したことがきっかけでした。その環境の状況は以下の通り。
- 600以上のIAMユーザーを管理しているアカウント
- ある月から突然Security Hubの料金が10倍以上に増えた
- 後の調査で分かったが、料金が増えた月に管理者が意図的に全リージョンでSecurity Hubの標準「FSBP(基礎セキュリティベストプラクティス)」を有効化していた
- Security Hub自体は以前から運用していた
ということで高騰の原因を探ってみました。
高額請求の原因
Security Hubの料金仕様
ということで高額請求の原因を探るのですが、その前にSecurity Hubの料金について確認します。
以下のドキュメントの通り、Security Hubでは主に3つのアクションで課金が発生します。
- セキュリティチェック
- 検出結果の取り込みイベント
- 自動化ルール
この中でも料金の多くを占めると思われるものが「セキュリティチェックによる課金」です。
セキュリティチェックとは、Security Hubの各コントロールが実行するセキュリティチェックのことです。
実はこのセキュリティチェックそのものはAWS Configのルールによって実行されます。このConfigルールはSecurity Hubの標準(スタンダード)を有効化した際に自動的に作成されるものです。
このように、私たちはSecurity HubがAWS Configから取り込んだセキュリティチェック結果を普段見ているのですが、この一連の流れで発生する料金はSecurity Hubの「セキュリティチェック」として課金されます。つまり、AWS Configの課金やセキュリティチェックに関連する検出結果の取り込みについての課金は発生しません。
以上を踏まえた上で、高額請求の原因を探っていきます。
原因を探ってみた
まず、どのリージョンでどのようにコストが発生しているかを確認するため、Cost Explorerで確認してみることにしました。
リージョンごとのSecurity Hub料金を確認したい場合、ディメンションを「使用タイプ」にして、サービスでSecurity Hubをフィルタリングすると良いです。
どうやら利用可能なリージョンの全てで同じように料金が発生しているようでした。ただ、他サービスのリソース状況を見ても東京リージョンやバージニアリージョン以外はほとんど使われていないようです。
ということで各リージョンのSecurity Hubを確認したところ、IAM系のコントロールが全て有効になっていることが分かりました。
ただ、特にIAMユーザーの変更等行っていないのに何故そこまでの料金が毎月発生しているのでしょうか?
ここで改めてSecurity Hubのセキュリティチェック実行スケジュールを確認してみます。
上記ドキュメントの通り、セキュリティチェックの実行スケジュールは各コントロールごとに主に以下の2パターンに分けられます。
- 定期的なチェック
- 変更によってトリガーされるチェック
このうち、定期的なチェックは12時間または24時間おきに実行されるものに分かれます。この話は以下の記事をご参照ください。
ということで、上記ブログの手法でFSBP(基礎セキュリティベストプラクティス)に含まれる定期実行されるIAMコントロールの実行頻度を確認してみました。
結果は下表の通りです。
コントロールID | 対象リソース | 実行頻度 |
---|---|---|
IAM.3 | IAMユーザー | 12時間 |
IAM.4 | AWSアカウント | 12時間 |
IAM.5 | IAMユーザー(※) | 12時間 |
IAM.6 | AWSアカウント | 12時間 |
IAM.7 | AWSアカウント | 12時間 |
IAM.8 | IAMユーザー | 12時間 |
※ コンソールパスワードが有効化されているIAMユーザーのみが対象
この結果から、IAMの定期実行コントロールだけでどれぐらいのコストがかかるかを算出してみました。
(2 * (IAMユーザー数) + (IAM.5対象のIAMユーザー数) + 3) * 2 * (日数) * (リージョン数) * (チェック料金 ※)
※Security Hubのチェック料金は使用量に応じて逓減されます。そのため、実際に計算する際はチェック料金までの計算結果(チェック回数)に応じて掛けるチェック料金を変動させてください。
FSBP(基礎セキュリティベストプラクティス)を有効化している場合、上記の計算式でIAM定期実行コントロールにかかる費用を算出することが可能です。
各数字の意味は左から以下の通りです。
- 2: IAMユーザーに関するコントロールが3つなので
- 3: AWSアカウントに関するコントロールが3つなので
- 2: 12時間おきなので日数の2倍
例えば、IAMユーザーを30個保持するアカウントが17リージョンでSecurity HubのFSBPを有効化した場合、1ヶ月(31日間)にかかる費用は以下の通りです。今回は全てのIAMユーザーがコンソールパスワードを持っているものとします。
(2 * 30 + 30+ 3) * 2 * 31 * 17 * 0.001 = 98.022
USD (今回はセキュリティのチェック料金を一律 0.001 USDで算出)
本ブログの冒頭にも記述しましたが、本来これらのグローバルリソースは任意の1リージョンを除いたその他全てのリージョンでは無効化することが推奨されています。本来これらのリソースは全てのリージョンからアクセス出来るというメリットがありつつも、このように全てのリージョンで記録されてしまうというデメリットもあるのです。
ちなみに、上記例で不要な16リージョンにおいて対象のコントロールを無効化した場合、以下のようにコストを抑えることが出来ます。
(3 * 30 + 3) * 2 * 31 * 1 * 0.001 = 5.766
USD
となり、98.022 - 5.766 = 92.256 と、一ヶ月あたり 90 USD 以上のコストを抑えることが出来ます。
実際に問題になっていた環境のコストも試算したところ、実際にかかっていた費用とほぼ同額が算出出来たため、今回の高額請求はIAMのコントロールを全てのリージョンで有効化していたことが一因だろうと推測しました。
ちなみに、本当に12時間おきに料金が発生しているかどうかはCost Explorerで粒度を「毎時」にすることで確認することが出来ます。
対応〜任意の1リージョン以外ではグローバルリソースのコントロールを無効化する〜
ということで、対象のアカウントに対してコントロールの無効化を実施します。
本記事の冒頭でも述べたように、Security HubのユーザーガイドではIAMのコントロールだけではなくグローバルリソースのコントロール全体の無効化が推奨されています。
しかし、今回はIAMのコントロールが原因だということをはっきりさせるためにもIAMのコントロールのみを無効化しました。
コントロールの無効化手法については以下のユーザーガイドで紹介されています。
また、今回のように複数リージョンでまとめて特定のコントロールを無効化したい場合は以下のブログを是非ご参照ください。最高のスクリプト紹介記事です。
対応の結果、今回は対象のアカウントで月あたり$1000以上のコストを抑えることが出来ました。
最後に
実は弊社テクニカルサポートノートではこの件についての記事も上がっていました。うっかり何かの拍子で全リージョンでスタンダードを有効化してしまったなど、似たような経験がある方は多いのではないでしょうか。
また、以下の記事にも記載がありますが、Security Hubの裏でAWS Configが動いているものの、Config側でIAMを記録から除外してもSecurity Hubのルールにこの設定変更は適用されません。つまり、Security Hubのセキュリティチェックを止めたい場合、必ず該当のコントロールを無効化する必要があります。
「うわっ…うちのSecurity Hub料金、高すぎ…?」と思っている方、是非各リージョンでちゃんとグローバルリソースのコントロールを無効化しているかご確認ください。
本ブログがどなたかのお役に立てば幸いです。
以上、べこみんでした。